from fastapi import APIRouter, HTTPException, Body
from app.models.schemas import MerchantDecisionRequest, MerchantDecisionResponse, ErrorResponse
from app.services.decision_service import get_decision
from app.core.llm import call_llm_gemini_image
import logging
import json
from typing import Dict, Any
from pydantic import BaseModel

# 获取日志记录器
logger = logging.getLogger(__name__)

# 创建路由器
router = APIRouter()

# 定义分析报告请求模型
class AnalysisReportRequest(BaseModel):
    report_data: str

# 分析报告响应模型    
class AnalysisReportResponse(BaseModel):
    analysis: Dict[str, Any]

# 定义分析报告请求模型 - 完整版
class AnalysisAllReportRequest(BaseModel):
    report_data: str
    analysis_type: str = "all"  # 分析类型，默认为"all"

# 分析报告响应模型 - 完整版
class AnalysisAllReportResponse(BaseModel):
    analysis: Dict[str, Any]
    status: str = "success"

@router.post(
    "/",
    response_model=MerchantDecisionResponse,
    responses={
        400: {"model": ErrorResponse},
        500: {"model": ErrorResponse}
    },
    summary="商家决策",
    description="根据商家评估结果提供决策建议"
)
async def decision_endpoint(request: MerchantDecisionRequest):
    """
    根据商家评分和数据进行决策
    
    - **evaluation_result**: 之前的评估结果
    - **decision_type**: 决策类型，如'贷款'、'合作'等
    - **decision_context**: 决策上下文信息（可选）
    
    返回:
    - 决策结果
    - 决策置信度
    - 决策理由
    - 建议措施
    """
    try:
        logger.info(f"收到商家决策请求: {request.evaluation_result.merchant_name}, 类型: {request.decision_type}")
        result = get_decision(request)
        return result
    except Exception as e:
        logger.error(f"决策过程出错: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"决策过程出错: {str(e)}")

@router.post(
    "/analysis",
    response_model=AnalysisReportResponse,
    responses={
        400: {"model": ErrorResponse},
        500: {"model": ErrorResponse}
    },
    summary="数据分析报告",
    description="根据餐饮行业短视频/直播平台运营数据生成分析报告"
)
async def analysis_report_endpoint(request: AnalysisReportRequest = Body(...)):
    """
    根据提供的运营数据生成分析报告
    
    - **report_data**: 包含运营数据的报告文本
    
    返回:
    - 分析结果包含核心问题梳理、运营方向建议和行动建议
    """
    try:
        logger.info("收到数据分析报告请求")
        
        # 从report.md中获取内容作为提示
        prompt = '''
                # ✅ AI运营分析

                ---

                ## 角色描述
                **你是一名专业的餐饮行业短视频/直播平台"运营数据分析师"。**  
                我将为你提供一组本周的运营数据，请你**只负责撰写"分析与建议"部分**，不需要重复数据或报表内容。  

                请按如下要求输出内容：  

                ---

                ## 📊【数据背景】  
                以下是本周的数据：  

                ''' + request.report_data + '''

            ## ✳️【输出要求】

            请你根据以上数据，生成一段"分析与建议"部分内容，结构必须如下：

            ### 一、核心问题梳理（3-5条）  
            请指出本期主要运营问题，并对每个问题进行简洁判断。格式为：  

            > - 【问题简述】，问题说明
            > - ……

            注意：
            1. 这里要充分考虑数据反应的问题，每一个问题说明，都要有数据支撑。
            2. "【"和"】"是必需的，不要省略。


            ### 二、运营方向建议（表格形式）  
            请以如下格式输出整体的优化方向建议：  

            | 模块      | 优化方向                           |
            |-----------|------------------------------------|
            | 直播内容  | 详细优化方向   |
            | 达人合作  | 详细优化方向    |
            | 视频内容  | 详细优化方向       |
            | 店员直播  | 详细优化方向       |
            | 官号运营  | 详细优化方向       |


            ### 三、行动建议（表格形式）  
            针对上面的问题，请输出可立即执行的操作建议，每个问题配1~2条。

            | 问题点               | 推荐动作                                                |
            |----------------------|---------------------------------------------------------|
            | 【问题点简述】        | 【动作1：】                              |
            |                      | 【动作2】                            |
            | 【问题点简述】        | 【动作1】                                                |
            |                      | ……                                                |

            注意，输出内容不要包含"动作1"和"动作2"字样，直接描述具体的执行路径和预期效果即可。

            ---

            ## 格式要求：
            输出为json格式，格式如下：

            ```json
            {
            "一、核心问题梳理": [
                "【问题简述】，原因说明。",
                ……
            ],
            "二、运营方向建议": {
                "模块": ["直播内容", "达人合作", "视频内容", "店员直播", "官号运营"],
                "优化方向": ["直播内容的详细优化方向", "达人合作的详细优化方向", "视频内容的详细优化方向", "店员直播的详细优化方向", "官号运营的详细优化方向"]
            },
            "三、行动建议": {
                "问题点": ["【问题点简述】", "【问题点简述】"，……],
                "推荐动作": [
                ["【动作1：直播内容】", "【动作2】", ……],
                ["【动作1】", ……],
                ……
                ]
            }
            }
            ```

            ## 📌 请注意：

            - 在分析判断中，要**有理有据**，引用数据和事实
            - **不要使用空话套话**，每条建议都要"可执行"  
            - **不要制定拍脑袋目标**，只提出有依据的动作建议  
            - 语言风格保持专业、简洁，整体篇幅控制在"一页"以内  

            ---

            请你直接生成"分析与建议"部分的内容。无需说明、无需重复数据，直接开始输出即可。

            ---'''
        
        # 调用LLM服务
        result = call_llm_gemini_image(
            prompt=prompt,
            params={},
            model="deepseek/deepseek-r1:free",
            return_json=True,
            retry=3
        )
        print(result, 'resultresultresult')
        # 解析JSON结果
        try:
            analysis_result = json.loads(result)
            return {"analysis": analysis_result}
        except json.JSONDecodeError:
            logger.error(f"无法解析JSON结果: {result}")
            raise HTTPException(status_code=500, detail="分析结果格式错误")
            
    except Exception as e:
        logger.error(f"分析过程出错: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"分析过程出错: {str(e)}")

@router.post(
    "/analysis_all",
    response_model=AnalysisAllReportResponse,
    responses={
        400: {"model": ErrorResponse},
        500: {"model": ErrorResponse}
    },
    summary="完整数据分析报告",
    description="根据餐饮行业短视频/直播平台运营数据生成完整分析报告"
)
async def analysis_all_report_endpoint(request: AnalysisAllReportRequest = Body(...)):
    """
    根据提供的运营数据生成完整分析报告
    
    - **report_data**: 包含运营数据的报告文本
    - **analysis_type**: 分析类型，默认为"all"
    
    返回:
    - 分析结果包含核心问题梳理、运营方向建议和行动建议
    """
    try:
        logger.info("收到完整数据分析报告请求")
        
        # 从report.md中获取内容作为提示
        prompt = '''
            你是优秀的本地生活运营，我给你一个线下店铺的运营数据，请你根据店名判断店铺所属的类别，并针对该类别给出对于这个店的运营改进建议。
            将运营建议输出位一个markdwon文本格式，除了运营建议外，不要输出其他内容。不要使用Markdown代码块(```)包装结果。
            标题固定为：# 运营分析（类型：xxxxxx）
            正文适当使用emoji，增加可读性。
            ---''' + request.report_data
        
        # 调用LLM服务
        result = call_llm_gemini_image(
            prompt=prompt,
            params={},
            model="deepseek/deepseek-r1:free",
            return_json=False,
            retry=3
        )
        print(result, 'resultresultresult')
        # 解析JSON结果
        try:
            analysis_json = json.dumps({"markdown": result}, ensure_ascii=False)
            analysis_result = json.loads(analysis_json)
            return {
                "analysis": analysis_result,
                "status": "success"
            }
        except json.JSONDecodeError:
            logger.error(f"无法解析JSON结果: {result}")
            raise HTTPException(status_code=500, detail="分析结果格式错误")
            
    except Exception as e:
        logger.error(f"完整分析过程出错: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"完整分析过程出错: {str(e)}") 